<?php
/**
 * Verwalten und Handlen von Uebersetzungen
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2013 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 *
 * */


Class Yapary_Translation_Translator
{
    private $oSql;
	private $languageCode;
    private $dbTableName = 'yapary_translator';
	private $arrException = array();


	/**
	 * @param $_languageCode : Sprachkennung im Format de_DE welche als default verwendet werden soll
	 * */
	function __construct (Yapary_Db_Sql_Connector $_oSql, $_languageCode)
	{
		if (!$_oSql->database()->table($this->dbTableName)->exists()) {
            $e = new Exception();
            $arrTrace = $e->getTrace();
            $trace = '<b>'.$arrTrace[0]['class'].$arrTrace[0]['type'].$arrTrace[0]['function'].'</b> in <b>'.$arrTrace[0]['file'].'</b> on line <b>'.$arrTrace[0]['line'].'</b>';
            trigger_error('<pre></b>No database installed<br />'.$trace.'</pre>', E_USER_WARNING);
		}

	    $this->oSql = $_oSql;
		$this->languageCode = $_languageCode;
	}


	/**
	 * Fuegt eine neue Uebersetzung hinzu
	 * @param string|int $translationId : Einmalige Kennung mit welcher die Uebersetzung angesprichen werden soll
	 * @param string $translation       : Uebersetzung zur Kennung
	 * @param string $languageName      : Sprachkennung im Format de_DE. Defaultwert siehe Konstruktor
	 * @return Yapary_Db_Sql_Result
	 * */
	public function add ($translationId, $translation, $languageCode = NULL)
	{
	    $languageCode = ($languageCode == NULL) ? $this->languageCode : $languageCode;
	    if ($this->exists($translationId, $translation, $languageCode)) {
	        return false;
	    }

        return $this->oSql->request("INSERT INTO translator
                					 (Name, LngCode, Translation) VALUES (:translationId, :languageCode, :translation)",
                                     array('translationId' => $translationId,
                                     	   'languageCode'  => $languageCode,
                                           'translation'   => $translation));
       echo $this->oSql->getQuery();
	}


	/**
	 * Bearbeitet einen bereits erstellten Eintrag
	 * @param string|int $translationId : Einmalige Kennung mit welcher die Uebersetzung angesprichen werden soll
	 * @param string $translationOld    : Uebersetzung zur Kennung
	 * @param string $translationNew    : Uebersetzung zur Kennung
	 * @param string $languageCodeOld   : Sprachkennung im Format de_DE. Defaultwert siehe Konstruktor
	 * @param string $languageCodeNew   : Sprachkennung im Format de_DE. Defaultwert siehe Konstruktor
	 * @return Yapary_Db_Sql_Result
	 * */
	public function update ($translationId, $translationOld, $translationNew, $languageCodeOld = NULL, $languageCodeNew = NULL)
	{
	    $languageCodeNew = ($languageCodeNew == NULL) ? $this->languageCode : $languageCodeNew;
	    $languageCodeOld = ($languageCodeOld == NULL) ? $this->languageCode : $languageCodeOld;
	    if (!$this->exists($translationId, $translationOld, $languageCodeOld)) {
	        return false;
	    }

	    return $this->oSql->request("UPDATE translator
                					 SET Name = :translationId, LngCode = :languageCodeNew, Translation = :translationNew
                					 WHERE Name = :translationId AND LngCode = :languageCodeOld AND Translation = :translationOld",
                                     array('translationId' => $translationId,
                                     	   'languageCodeNew'  => $languageCodeNew,
                                           'translationNew'   => $translationNew,
                                     	   'languageCodeOld'  => $languageCodeOld,
                                           'translationOld'   => $translationOld));

	}


	/**
	 * Loescht einen erstellten Eintrag
	 * @param string|int $translationId : Einmalige Kennung mit welcher die Uebersetzung angesprichen werden soll
	 * @param string $translation       : Uebersetzung zur Kennung
	 * @param string $languageName      : Sprachkennung im Format de_DE. Defaultwert siehe Konstruktor
	 * @return Yapary_Db_Sql_Result
	 * */
	public function delete ($translationId, $translation, $languageCode = NULL)
	{
	    $languageCode = ($languageCode == NULL) ? $this->languageCode : $languageCode;
	    if (!$this->exists($translationId, $translation, $languageCode)) {
	        return false;
	    }

	    return $this->oSql->request("DELETE FROM translator
                					 WHERE Name = :translationId AND LngCode = :languageCode AND Translation = :translation",
                                     array('translationId' => $translationId,
                                     	   'languageCode'  => $languageCode,
                                           'translation'   => $translation));

	}


	/**
	 * Prueft ob der Eintrag existiert
	 * @param string|int $translationId : Einmalige Kennung mit welcher die Uebersetzung angesprichen werden soll
	 * @param string $translation       : Uebersetzung zur Kennung
	 * @param string $languageCode      : Sprachkennung im Format de_DE. Defaultwert siehe Konstruktor
	 * @return bool
	 * */
	public function exists ($translationId, $translation, $languageCode = NULL)
	{
	    $languageCode = ($languageCode == NULL) ? $this->languageCode : $languageCode;

	    $oDbResult = $this->oSql->request("SELECT COUNT(*) AS Counter
        					  FROM translator
        					  WHERE Name = :translationId AND LngCode = :languageCode AND Translation = :translation",
                             array('translationId' => $translationId,
                             	   'languageCode'  => $languageCode,
                                   'translation'   => $translation));
        $row = $oDbResult->getNext();
        if ($row->Counter == 1) {
            return true;
        }

        return false;
	}


	/**
	* Uebersetzt den definierten Text
	* @param string $str : Zu uebersetzender Text
	* @return string|NULL
	*/
	public function get ($translationId, $languageCode = NULL)
	{
	    return $this->translate($translationId, $languageCode = NULL);
	}
	public function translate ($translationId, $languageCode = NULL)
	{
	    $languageCode = ($languageCode == NULL) ? $this->languageCode : $languageCode;

	    $oDBResult = $this->oSql->request("SELECT Translation
        					  FROM translator
        					  WHERE Name = :translationId AND LngCode = :languageCode",
                             array('translationId' => $translationId,
                             	   'languageCode'  => $languageCode));

		if ($oDBResult->getCount() == 1) {
		    $row = $oDBResult->getNext();
			return $row->Translation;
		} else {
		    $this->arrException[] = new Exception("no translation for $translationId\n");
			return NULL;
		}
	}


	/**
	* Liefert alle ausgeloesten Exceptions
	* @return array : array(0=>Exception1, 1=>Exception2, ...)
	*/
	public function &getExceptionList ()
	{
		return $this->arrException;
	}


	/**
	* Liefert die Anzahl der vorhandenen Exceptions
	* @return int
	*/
	public function getExceptionCount ()
	{
		return count($this->arrException);
	}


}


?>